// useForm.ts
import { reactive } from 'vue';
import { cloneDeep } from 'lodash-es';
import { useTemplateRef } from 'vue';
import type { FormInst } from 'naive-ui';

interface UseFormOptions {
  formRefName?: string;
}

export function useForm<T extends object>(initialState: T, options: UseFormOptions = {}) {
  const { formRefName = 'formRef' } = options;

  // 初始表单状态
  const initState = cloneDeep(initialState);

  // 绑定给 n-form 的 model
  const form = reactive(cloneDeep(initState)) as T;

  // 使用可自定义名称
  const formRef = useTemplateRef<FormInst>(formRefName);

  /** 重置表单（新增） */
  function reset() {
    Object.assign(form, cloneDeep(initState));
    formRef.value?.restoreValidation();
  }

  /** 设置表单（编辑） */
  function setForm(data: Partial<T>) {
    Object.assign(form, data);
  }

  /** 主动校验 */
  function validate() {
    return new Promise((resolve, reject) => {
      if (!formRef.value) {
        reject(new Error('formRef不存在'));
        return;
      }

      formRef.value.validate((errors) => {
        resolve(errors);
      });
    });
  }

  /** 手动清空校验 */
  function clearValidate() {
    formRef.value?.restoreValidation();
  }

  return {
    form,
    formRef,
    reset,
    setForm,
    validate,
    clearValidate,
  };
}
